package com.it.rabbitmqwithjiang.Config;


import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;



@Configuration
public class DeadConfig {

    /*
     TTL 是 RabbitMQ 中一个消息或者队列的属性，表明一条消息或者该队列中的所有消息的最大存活时间，单位是毫秒。
    给队列设置 ttl 属性，进入队列后超过 ttl 时间的消息变为死信
    给消息设置 ttl 属性，队列接收到消息超过 ttl 时间后变为死信
    * */

    //为了实现消息的延迟消费，我们需要再定义一组接收超时消息的交换机和队列并把两者绑定，设置超时时间为 10s：

    @Bean
    public DirectExchange ttlExchange(){
        return new DirectExchange("TtlDirect");
    }

    @Bean
    public Queue ttlQueue(){
        return QueueBuilder.durable("TtlQueue")
                .ttl(10000)    // 设置队列的超时时间，10秒
                .deadLetterExchange("Deletedirect")
                .deadLetterRoutingKey("Delete")
                .build();
    }

    @Bean
    public Binding ttlBinding(){
        return BindingBuilder.bind(ttlQueue()).to(ttlExchange()).with("TTL");
    }

    /*
    *   消费者使用 basic.reject 或 basic.nack 声明消费失败，并且消息的 requeue 参数设置为 false
    消息是一个过期消息，超时无人消费
    要投递的队列消息满了，无法投递
    * * */

    @Bean
    public DirectExchange dlExchange() {
        // 声明死信交换机 dl.direct
        return new DirectExchange("Deletedirect", true, false);
    }


    @Bean
    public Queue dlQueue() {
        // 声明存储死信的队列 dl.queue
        return new Queue("Deletequeue", true);
    }


    @Bean
    public Binding dlBinding() {
        // 将死信队列 与 死信交换机绑定
        return BindingBuilder.bind(dlQueue()).to(dlExchange()).with("Delete");
    }





}
